/*
 * Copyright (c) 2011, 2014-2015, 2018 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef CDS_IEEE80211_DEFINES_H_
#define CDS_IEEE80211_DEFINES_H_

#include "cds_ieee80211_common.h"

/*
 * Public defines for Atheros Upper MAC Layer
 */

/**
 * @brief Opaque handle of 802.11 protocal layer.
 */
struct ieee80211com;
typedef struct ieee80211com *wlan_dev_t;

/**
 * @brief Opaque handle to App IE module.
 */
struct wlan_mlme_app_ie;
typedef struct wlan_mlme_app_ie *wlan_mlme_app_ie_t;

/**
 * @brief Opaque handle of network instance (vap) in 802.11 protocal layer.
 */
struct ieee80211vap;
typedef struct ieee80211vap *wlan_if_t;

struct ieee80211vapprofile;
typedef struct ieee80211vapprofile *wlan_if_info_t;

/**
 * @brief Opaque handle of a node in the wifi network.
 */
struct ieee80211_node;
typedef struct ieee80211_node *wlan_node_t;

/**
 * @brief Opaque handle of OS interface (ifp in the case of unix ).
 */
struct _os_if_t;
typedef struct _os_if_t *os_if_t;

/**
 *
 * @brief Opaque handle.
 */
typedef void *os_handle_t;

/**
 * @brief Opaque handle of a channel.
 */
struct ieee80211_channel;
typedef struct ieee80211_channel *wlan_chan_t;

/**
 * @brief Opaque handle scan_entry.
 */
struct ieee80211_scan_entry;
typedef struct ieee80211_scan_entry *wlan_scan_entry_t;

/* AoW related defines */
#define AOW_MAX_RECEIVER_COUNT  10

#define IEEE80211_NWID_LEN                  32
#define IEEE80211_ISO_COUNTRY_LENGTH        3   /* length of 11d ISO country string */

typedef struct _ieee80211_ssid {
	int len;
	uint8_t ssid[IEEE80211_NWID_LEN];
} ieee80211_ssid;

typedef struct ieee80211_tx_status {
	int ts_flags;
#define IEEE80211_TX_ERROR          0x01
#define IEEE80211_TX_XRETRY         0x02

	int ts_retries;         /* number of retries to successfully transmit this frame */
#ifdef ATH_SUPPORT_TxBF
	uint8_t ts_txbfstatus;
#define AR_BW_Mismatch      0x1
#define AR_Stream_Miss      0x2
#define AR_CV_Missed        0x4
#define AR_Dest_Miss        0x8
#define AR_Expired          0x10
#define AR_TxBF_Valid_HW_Status    (AR_BW_Mismatch|AR_Stream_Miss|AR_CV_Missed|AR_Dest_Miss|AR_Expired)
#define TxBF_STATUS_Sounding_Complete   0x20
#define TxBF_STATUS_Sounding_Request    0x40
#define TxBF_Valid_SW_Status  (TxBF_STATUS_Sounding_Complete | TxBF_STATUS_Sounding_Request)
#define TxBF_Valid_Status  (AR_TxBF_Valid_HW_Status | TxBF_Valid_SW_Status)
	uint32_t ts_tstamp;     /* tx time stamp */
#endif
#ifdef ATH_SUPPORT_FLOWMAC_MODULE
	uint8_t ts_flowmac_flags;
#define IEEE80211_TX_FLOWMAC_DONE           0x01
#endif
	uint32_t ts_rateKbps;
} ieee80211_xmit_status;

#ifndef EXTERNAL_USE_ONLY
typedef struct ieee80211_rx_status {
	int rs_numchains;
	int rs_flags;
#define IEEE80211_RX_FCS_ERROR      0x01
#define IEEE80211_RX_MIC_ERROR      0x02
#define IEEE80211_RX_DECRYPT_ERROR  0x04
/* holes in flags here between, ATH_RX_XXXX to IEEE80211_RX_XXX */
#define IEEE80211_RX_KEYMISS        0x200
	int rs_rssi;            /* RSSI (noise floor ajusted) */
	int rs_abs_rssi;        /* absolute RSSI */
	int rs_datarate;        /* data rate received */
	int rs_rateieee;
	int rs_ratephy;

#define IEEE80211_MAX_ANTENNA       3   /* Keep the same as ATH_MAX_ANTENNA */
	uint8_t rs_rssictl[IEEE80211_MAX_ANTENNA];      /* RSSI (noise floor ajusted) */
	uint8_t rs_rssiextn[IEEE80211_MAX_ANTENNA];     /* RSSI (noise floor ajusted) */
	uint8_t rs_isvalidrssi; /* rs_rssi is valid or not */

	enum ieee80211_phymode rs_phymode;
	int rs_freq;

	union {
		uint8_t data[8];
		uint64_t tsf;
	} rs_tstamp;

	/*
	 * Detail channel structure of recv frame.
	 * It could be NULL if not available
	 */
	struct ieee80211_channel *rs_full_chan;

	uint8_t rs_isaggr;
	uint8_t rs_isapsd;
	int16_t rs_noisefloor;
	uint16_t rs_channel;
#ifdef ATH_SUPPORT_TxBF
	uint32_t rs_rpttstamp;  /* txbf report time stamp */
#endif

	/* The following counts are meant to assist in stats calculation.
	   These variables are incremented only in specific situations, and
	   should not be relied upon for any purpose other than the original
	   stats related purpose they have been introduced for. */

	uint16_t rs_cryptodecapcount;   /* Crypto bytes decapped/demic'ed. */
	uint8_t rs_padspace;    /* No. of padding bytes present after header
	                           in wbuf. */
	uint8_t rs_qosdecapcount;       /* QoS/HTC bytes decapped. */

	/* End of stats calculation related counts. */

	uint8_t rs_lsig[IEEE80211_LSIG_LEN];
	uint8_t rs_htsig[IEEE80211_HTSIG_LEN];
	uint8_t rs_servicebytes[IEEE80211_SB_LEN];

} ieee80211_recv_status;
#endif /* EXTERNAL_USE_ONLY */

/*
 * flags to be passed to ieee80211_vap_create function .
 */
#define IEEE80211_CLONE_BSSID           0x0001  /* allocate unique mac/bssid */
#define IEEE80211_CLONE_NOBEACONS       0x0002  /* don't setup beacon timers */
#define IEEE80211_CLONE_WDS             0x0004  /* enable WDS processing */
#define IEEE80211_CLONE_WDSLEGACY       0x0008  /* legacy WDS operation */
#define IEEE80211_PRIMARY_VAP           0x0010  /* primary vap */
#define IEEE80211_P2PDEV_VAP            0x0020  /* p2pdev vap */
#define IEEE80211_P2PGO_VAP             0x0040  /* p2p-go vap */
#define IEEE80211_P2PCLI_VAP            0x0080  /* p2p-client vap */
#define IEEE80211_CLONE_MACADDR         0x0100  /* create vap w/ specified mac/bssid */
#define IEEE80211_CLONE_MATADDR         0x0200  /* create vap w/ specified MAT addr */
#define IEEE80211_WRAP_VAP              0x0400  /* wireless repeater ap vap */

/*
 * For the new multi-vap scan feature, there is a set of default priority tables
 * for each OpMode.
 * The following are the default list of the VAP Scan Priority Mapping based on OpModes.
 * NOTE: the following are only used when "#if ATH_SUPPORT_MULTIPLE_SCANS" is true.
 */
/* For IBSS opmode */
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_IBSS_BASE               0
/* For STA opmode */
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_STA_BASE                0
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_STA_P2P_CLIENT          1
/* For HostAp opmode */
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_AP_BASE                 0
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_AP_P2P_GO               1
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_AP_P2P_DEVICE           2
/* For BTAmp opmode */
#define DEF_VAP_SCAN_PRI_MAP_OPMODE_BTAMP_BASE              0

typedef enum _ieee80211_dev_vap_event {
	IEEE80211_VAP_CREATED = 1,
	IEEE80211_VAP_STOPPED,
	IEEE80211_VAP_DELETED
} ieee80211_dev_vap_event;

typedef struct _wlan_dev_event_handler_table {
	void (*wlan_dev_vap_event)(void *event_arg, wlan_dev_t, os_if_t, ieee80211_dev_vap_event);      /* callback to receive vap events */
#ifdef ATH_SUPPORT_SPECTRAL
	void (*wlan_dev_spectral_indicate)(void *, void *, uint32_t);
#endif
} wlan_dev_event_handler_table;

typedef enum _ieee80211_ap_stopped_reason {
	IEEE80211_AP_STOPPED_REASON_DUMMY = 0,  /* Dummy placeholder. Should not use */
	IEEE80211_AP_STOPPED_REASON_CHANNEL_DFS = 1,
} ieee80211_ap_stopped_reason;

typedef int IEEE80211_REASON_CODE;
typedef int IEEE80211_STATUS;

/*
 * scan API related structs.
 */
typedef enum _ieee80211_scan_type {
	IEEE80211_SCAN_BACKGROUND,
	IEEE80211_SCAN_FOREGROUND,
	IEEE80211_SCAN_SPECTRAL,
	IEEE80211_SCAN_REPEATER_BACKGROUND,
	IEEE80211_SCAN_REPEATER_EXT_BACKGROUND,
	IEEE80211_SCAN_RADIO_MEASUREMENTS,
} ieee80211_scan_type;

/*
 * Priority numbers must be sequential, starting with 0.
 */
typedef enum ieee80211_scan_priority_t {
	IEEE80211_SCAN_PRIORITY_VERY_LOW = 0,
	IEEE80211_SCAN_PRIORITY_LOW,
	IEEE80211_SCAN_PRIORITY_MEDIUM,
	IEEE80211_SCAN_PRIORITY_HIGH,
	IEEE80211_SCAN_PRIORITY_VERY_HIGH,

	IEEE80211_SCAN_PRIORITY_COUNT   /* number of priorities supported */
} IEEE80211_SCAN_PRIORITY;

typedef uint16_t IEEE80211_SCAN_REQUESTOR;
typedef uint32_t IEEE80211_SCAN_ID;

#define IEEE80211_SCAN_ID_NONE                    0

/* All P2P scans currently use medium priority */
#define IEEE80211_P2P_DEFAULT_SCAN_PRIORITY       IEEE80211_SCAN_PRIORITY_MEDIUM
#define IEEE80211_P2P_SCAN_PRIORITY_HIGH          IEEE80211_SCAN_PRIORITY_HIGH

/* Masks identifying types/ID of scans */
#define IEEE80211_SPECIFIC_SCAN       0x00000000
#define IEEE80211_VAP_SCAN            0x01000000
#define IEEE80211_ALL_SCANS           0x04000000

/**
 * host scan bit. only relevant for host/target architecture.
 * do not reuse this bit definition. target uses this .
 *
 */
#define IEEE80211_HOST_SCAN           0x80000000
#define IEEE80211_SCAN_CLASS_MASK     0xFF000000

#define IEEE80211_SCAN_PASSIVE            0x0001        /* passively scan all the channels */
#define IEEE80211_SCAN_ACTIVE             0x0002        /* actively  scan all the channels (regdomain rules still apply) */
#define IEEE80211_SCAN_2GHZ               0x0004        /* scan 2GHz band */
#define IEEE80211_SCAN_5GHZ               0x0008        /* scan 5GHz band */
#define IEEE80211_SCAN_ALLBANDS           (IEEE80211_SCAN_5GHZ | IEEE80211_SCAN_2GHZ)
#define IEEE80211_SCAN_CONTINUOUS         0x0010        /* keep scanning until maxscantime expires */
#define IEEE80211_SCAN_FORCED             0x0020        /* forced scan (OS request) - should proceed even in the presence of data traffic */
#define IEEE80211_SCAN_NOW                0x0040        /* scan now (User request)  - should proceed even in the presence of data traffic */
#define IEEE80211_SCAN_ADD_BCAST_PROBE    0x0080        /* add wildcard ssid and broadcast probe request if there is none */
#define IEEE80211_SCAN_EXTERNAL           0x0100        /* scan requested by OS */
#define IEEE80211_SCAN_BURST              0x0200        /* scan multiple channels before returning to BSS channel */
#define IEEE80211_SCAN_CHAN_EVENT         0x0400        /* scan chan event for  offload architectures */
#define IEEE80211_SCAN_FILTER_PROBE_REQ   0x0800        /* Filter probe requests- applicable only for offload architectures */

#define IEEE80211_SCAN_PARAMS_MAX_SSID     10
#define IEEE80211_SCAN_PARAMS_MAX_BSSID    10

/* flag definitions passed to scan_cancel API */

#define IEEE80211_SCAN_CANCEL_ASYNC 0x0 /* asynchronouly wait for scan SM to complete cancel */
#define IEEE80211_SCAN_CANCEL_WAIT  0x1 /* wait for scan SM to complete cancel */
#define IEEE80211_SCAN_CANCEL_SYNC  0x2 /* synchronously execute cancel scan */

#ifndef EXTERNAL_USE_ONLY
typedef bool (*ieee80211_scan_termination_check)(void *arg);

typedef struct _ieee80211_scan_params {
	ieee80211_scan_type type;
	int min_dwell_time_active;      /* min time in msec on active channels */
	int max_dwell_time_active;      /* max time in msec on active channels (if no response) */
	int min_dwell_time_passive;     /* min time in msec on passive channels */
	int max_dwell_time_passive;     /* max time in msec on passive channels (if no response) */
	int min_rest_time;      /* min time in msec on the BSS channel, only valid for BG scan */
	int max_rest_time;      /* max time in msec on the BSS channel, only valid for BG scan */
	int max_offchannel_time;        /* max time away from BSS channel, in ms */
	int repeat_probe_time;  /* time before sending second probe request */
	int idle_time;          /* time in msec on bss channel before switching channel */
	int max_scan_time;      /* maximum time in msec allowed for scan  */
	int probe_delay;        /* delay in msec before sending probe request */
	int offchan_retry_delay;        /* delay in msec before retrying off-channel switch */
	int min_beacon_count;   /* number of home AP beacons to receive before leaving the home channel */
	int max_offchan_retries;        /* maximum number of times to retry off-channel switch */
	int beacon_timeout;     /* maximum time to wait for beacons */
	int flags;              /* scan flags */
	int num_channels;       /* number of channels to scan */
	bool multiple_ports_active;     /* driver has multiple ports active in the home channel */
	bool restricted_scan;   /* Perform restricted scan */
	bool chan_list_allocated;
	IEEE80211_SCAN_PRIORITY p2p_scan_priority;      /* indicates the scan priority if this is a P2P-related scan */
	uint32_t *chan_list;    /* array of ieee channels (or) frequencies to scan */
	int num_ssid;           /* number of desired ssids */
	ieee80211_ssid ssid_list[IEEE80211_SCAN_PARAMS_MAX_SSID];
	int num_bssid;          /* number of desired bssids */
	uint8_t bssid_list[IEEE80211_SCAN_PARAMS_MAX_BSSID][IEEE80211_ADDR_LEN];
	struct ieee80211_node *bss_node;        /* BSS node */
	int ie_len;             /* length of the ie data to be added to probe req */
	uint8_t *ie_data;       /* pointer to ie data */
	ieee80211_scan_termination_check check_termination_function;    /* function checking for termination condition */
	void *check_termination_context;        /* context passed to function above */
} ieee80211_scan_params;

/* Data types used to specify scan priorities */
typedef uint32_t IEEE80211_PRIORITY_MAPPING[IEEE80211_SCAN_PRIORITY_COUNT];

/**************************************
 * Called before attempting to roam.  Modifies the rssiAdder of a BSS
 * based on the preferred status of a BSS.
 *
 * According to CCX spec, AP in the neighbor list is not meant for giving extra
 * weightage in roaming. By doing so, roaming becomes sticky. See bug 21220.
 * Change the weightage to 0. Cisco may ask in future for a user control of
 * this weightage.
 */
#define PREFERRED_BSS_RANK                20
#define NEIGHBOR_BSS_RANK                  0    /* must be less than preferred BSS rank */

/*
 * The utility of the BSS is the metric used in the selection
 * of a BSS. The Utility of the BSS is reduced if we just left the BSS.
 * The Utility of the BSS is not reduced if we have left the
 * BSS for 8 seconds (8000ms) or more.
 * 2^13 milliseconds is a close approximation to avoid expensive division
 */
#define LAST_ASSOC_TIME_DELTA_REQUIREMENT (1 << 13)     /* 8192 */

#define QBSS_SCALE_MAX                   255    /* Qbss channel load Max value */
#define QBSS_SCALE_DOWN_FACTOR             2    /* scale factor to reduce Qbss channel load */
#define QBSS_HYST_ADJ                     60    /* Qbss Weightage factor for the current AP */

/*
 * Flags used to set field APState
 */
#define AP_STATE_GOOD    0x00
#define AP_STATE_BAD     0x01
#define AP_STATE_RETRY   0x10
#define BAD_AP_TIMEOUT   6000   /* In milli seconds */
/*
 * To disable BAD_AP status check on any scan entry
 */
#define BAD_AP_TIMEOUT_DISABLED             0

/*
 * BAD_AP timeout specified in seconds
 */
#define BAD_AP_TIMEOUT_IN_SECONDS           10

/*
 * State values used to represent our assoc_state with ap (discrete, not bitmasks)
 */
#define AP_ASSOC_STATE_NONE     0
#define AP_ASSOC_STATE_AUTH     1
#define AP_ASSOC_STATE_ASSOC    2

/*
 * Entries in the scan list are considered obsolete after 75 seconds.
 */
#define IEEE80211_SCAN_ENTRY_EXPIRE_TIME           75000

/*
 * idle time is only valid for scan type IEEE80211_SCAN_BACKGROUND.
 * if idle time is set then the scanner would change channel from BSS
 * channel to foreign channel only if both resttime is expired and
 * the theres was not traffic for idletime msec on the bss channel.
 * value of 0 for idletime would cause the channel to switch from BSS
 * channel to foreign channel as soon  as the resttime is expired.
 *
 * if maxscantime is nonzero and if the scanner can not complete the
 * scan in maxscantime msec then the scanner will cancel the scan and
 * post IEEE80211_SCAN_COMPLETED event with reason SCAN_TIMEDOUT.
 *
 */

/*
 * chanlist can be either ieee channels (or) frequencies.
 * if a value is less than 1000 implementation assumes it
 * as ieee channel # otherwise implementation assumes it
 * as frequency in Mhz.
 */

typedef enum _ieee80211_scan_event_type {
	IEEE80211_SCAN_STARTED,
	IEEE80211_SCAN_COMPLETED,
	IEEE80211_SCAN_RADIO_MEASUREMENT_START,
	IEEE80211_SCAN_RADIO_MEASUREMENT_END,
	IEEE80211_SCAN_RESTARTED,
	IEEE80211_SCAN_HOME_CHANNEL,
	IEEE80211_SCAN_FOREIGN_CHANNEL,
	IEEE80211_SCAN_BSSID_MATCH,
	IEEE80211_SCAN_FOREIGN_CHANNEL_GET_NF,
	IEEE80211_SCAN_DEQUEUED,
	IEEE80211_SCAN_PREEMPTED,

	IEEE80211_SCAN_EVENT_COUNT
} ieee80211_scan_event_type;

typedef enum ieee80211_scan_completion_reason {
	IEEE80211_REASON_NONE,
	IEEE80211_REASON_COMPLETED,
	IEEE80211_REASON_CANCELLED,
	IEEE80211_REASON_TIMEDOUT,
	IEEE80211_REASON_TERMINATION_FUNCTION,
	IEEE80211_REASON_MAX_OFFCHAN_RETRIES,
	IEEE80211_REASON_PREEMPTED,
	IEEE80211_REASON_RUN_FAILED,
	IEEE80211_REASON_INTERNAL_STOP,

	IEEE80211_REASON_COUNT
} ieee80211_scan_completion_reason;

typedef struct _ieee80211_scan_event {
	ieee80211_scan_event_type type;
	ieee80211_scan_completion_reason reason;
	wlan_chan_t chan;
	IEEE80211_SCAN_REQUESTOR requestor;     /* Requestor ID passed to the scan_start function */
	IEEE80211_SCAN_ID scan_id;      /* Specific ID of the scan reporting the event */
} ieee80211_scan_event;

typedef enum _ieee80211_scan_request_status {
	IEEE80211_SCAN_STATUS_QUEUED,
	IEEE80211_SCAN_STATUS_RUNNING,
	IEEE80211_SCAN_STATUS_PREEMPTED,
	IEEE80211_SCAN_STATUS_COMPLETED
} ieee80211_scan_request_status;

/*
 * the sentry field of tht ieee80211_scan_event is only valid if the
 * event type is IEEE80211_SCAN_BSSID_MATCH.
 */

typedef void (*ieee80211_scan_event_handler)(wlan_if_t vaphandle,
					     ieee80211_scan_event *event,
					     void *arg);

typedef struct _ieee80211_scan_info {
	ieee80211_scan_type type;
	IEEE80211_SCAN_REQUESTOR requestor;     /* Originator ID passed to the scan_start function */
	IEEE80211_SCAN_ID scan_id;      /* Specific ID of the scan reporting the event */
	IEEE80211_SCAN_PRIORITY priority;       /* Requested priority level (low/medium/high) */
	ieee80211_scan_request_status scheduling_status;        /* Queued/running/preempted/completed */
	int min_dwell_time_active;      /* min time in msec on active channels */
	int max_dwell_time_active;      /* max time in msec on active channel (if no response) */
	int min_dwell_time_passive;     /* min time in msec on passive channels */
	int max_dwell_time_passive;     /* max time in msec on passive channel */
	int min_rest_time;      /* min time in msec on the BSS channel, only valid for BG scan */
	int max_rest_time;      /* max time in msec on the BSS channel, only valid for BG scan */
	int max_offchannel_time;        /* max time away from BSS channel, in ms */
	int repeat_probe_time;  /* time before sending second probe request */
	int min_beacon_count;   /* number of home AP beacons to receive before leaving the home channel */
	int flags;              /* scan flags */
	systime_t scan_start_time;      /* system time when last scani started */
	int scanned_channels;   /* number of scanned channels */
	int default_channel_list_length;        /* number of channels in the default channel list */
	int channel_list_length;        /* number of channels in the channel list used for the current scan */
	uint8_t in_progress : 1,  /* if the scan is in progress */
		cancelled : 1,  /* if the scan is cancelled */
		preempted : 1,  /* if the scan is preempted */
		restricted : 1; /* if the scan is restricted */
} ieee80211_scan_info;

typedef struct _ieee80211_scan_request_info {
	wlan_if_t vaphandle;
	IEEE80211_SCAN_REQUESTOR requestor;
	IEEE80211_SCAN_PRIORITY requested_priority;
	IEEE80211_SCAN_PRIORITY absolute_priority;
	IEEE80211_SCAN_ID scan_id;
	ieee80211_scan_request_status scheduling_status;
	ieee80211_scan_params params;
	systime_t request_timestamp;
	uint32_t maximum_duration;
} ieee80211_scan_request_info;

#endif /* EXTERNAL_USE_ONLY */

#ifndef EXTERNAL_USE_ONLY
typedef void (*ieee80211_acs_event_handler)(void *arg, wlan_chan_t channel);
#endif /* EXTERNAL_USE_ONLY */

#define MAX_CHAINS 3

typedef struct _wlan_rssi_info {
	int8_t avg_rssi;        /* average rssi */
	uint8_t valid_mask;     /* bitmap of valid elements in rssi_ctrl/ext array */
	int8_t rssi_ctrl[MAX_CHAINS];
	int8_t rssi_ext[MAX_CHAINS];
} wlan_rssi_info;

typedef enum _wlan_rssi_type {
	WLAN_RSSI_TX,
	WLAN_RSSI_RX,
	WLAN_RSSI_BEACON,       /* rssi of the beacon, only valid for STA/IBSS vap */
	WLAN_RSSI_RX_DATA
} wlan_rssi_type;

typedef enum _ieee80211_rate_type {
	IEEE80211_RATE_TYPE_LEGACY,
	IEEE80211_RATE_TYPE_MCS,
} ieee80211_rate_type;

typedef struct _ieee80211_rate_info {
	ieee80211_rate_type type;
	uint32_t rate;          /* average rate in kbps */
	uint32_t lastrate;      /* last packet rate in kbps */
	uint8_t mcs;            /* mcs index . is valid if rate type is MCS20 or MCS40 */
	uint8_t maxrate_per_client;
} ieee80211_rate_info;

typedef enum _ieee80211_node_param_type {
	IEEE80211_NODE_PARAM_TX_POWER,
	IEEE80211_NODE_PARAM_ASSOCID,
	IEEE80211_NODE_PARAM_INACT,     /* inactivity timer value */
	IEEE80211_NODE_PARAM_AUTH_MODE, /* auth mode */
	IEEE80211_NODE_PARAM_CAP_INFO,  /* auth mode */
} ieee80211_node_param_type;

/*
 * Per/node (station) statistics available when operating as an AP.
 */
struct ieee80211_nodestats {
	uint32_t ns_rx_data;    /* rx data frames */
	uint32_t ns_rx_mgmt;    /* rx management frames */
	uint32_t ns_rx_ctrl;    /* rx control frames */
	uint32_t ns_rx_ucast;   /* rx unicast frames */
	uint32_t ns_rx_mcast;   /* rx multi/broadcast frames */
	uint64_t ns_rx_bytes;   /* rx data count (bytes) */
	uint64_t ns_rx_beacons; /* rx beacon frames */
	uint32_t ns_rx_proberesp;       /* rx probe response frames */

	uint32_t ns_rx_dup;     /* rx discard 'cuz dup */
	uint32_t ns_rx_noprivacy;       /* rx w/ wep but privacy off */
	uint32_t ns_rx_wepfail; /* rx wep processing failed */
	uint32_t ns_rx_demicfail;       /* rx demic failed */

	/* We log MIC and decryption failures against Transmitter STA stats.
	   Though the frames may not actually be sent by STAs corresponding
	   to TA, the stats are still valuable for some customers as a sort
	   of rough indication.
	   Also note that the mapping from TA to STA may fail sometimes. */
	uint32_t ns_rx_tkipmic; /* rx TKIP MIC failure */
	uint32_t ns_rx_ccmpmic; /* rx CCMP MIC failure */
	uint32_t ns_rx_wpimic;  /* rx WAPI MIC failure */
	uint32_t ns_rx_tkipicv; /* rx ICV check failed (TKIP) */
	uint32_t ns_rx_decap;   /* rx decapsulation failed */
	uint32_t ns_rx_defrag;  /* rx defragmentation failed */
	uint32_t ns_rx_disassoc;        /* rx disassociation */
	uint32_t ns_rx_deauth;  /* rx deauthentication */
	uint32_t ns_rx_action;  /* rx action */
	uint32_t ns_rx_decryptcrc;      /* rx decrypt failed on crc */
	uint32_t ns_rx_unauth;  /* rx on unauthorized port */
	uint32_t ns_rx_unencrypted;     /* rx unecrypted w/ privacy */

	uint32_t ns_tx_data;    /* tx data frames */
	uint32_t ns_tx_data_success;    /* tx data frames successfully
	                                   transmitted (unicast only) */
	uint32_t ns_tx_mgmt;    /* tx management frames */
	uint32_t ns_tx_ucast;   /* tx unicast frames */
	uint32_t ns_tx_mcast;   /* tx multi/broadcast frames */
	uint64_t ns_tx_bytes;   /* tx data count (bytes) */
	uint64_t ns_tx_bytes_success;   /* tx success data count - unicast only
	                                   (bytes) */
	uint32_t ns_tx_probereq;        /* tx probe request frames */
	uint32_t ns_tx_uapsd;   /* tx on uapsd queue */
	uint32_t ns_tx_discard; /* tx dropped by NIC */

	uint32_t ns_tx_novlantag;       /* tx discard 'cuz no tag */
	uint32_t ns_tx_vlanmismatch;    /* tx discard 'cuz bad tag */

	uint32_t ns_tx_eosplost;        /* uapsd EOSP retried out */

	uint32_t ns_ps_discard; /* ps discard 'cuz of age */

	uint32_t ns_uapsd_triggers;     /* uapsd triggers */
	uint32_t ns_uapsd_duptriggers;  /* uapsd duplicate triggers */
	uint32_t ns_uapsd_ignoretriggers;       /* uapsd duplicate triggers */
	uint32_t ns_uapsd_active;       /* uapsd duplicate triggers */
	uint32_t ns_uapsd_triggerenabled;       /* uapsd duplicate triggers */

	/* MIB-related state */
	uint32_t ns_tx_assoc;   /* [re]associations */
	uint32_t ns_tx_assoc_fail;      /* [re]association failures */
	uint32_t ns_tx_auth;    /* [re]authentications */
	uint32_t ns_tx_auth_fail;       /* [re]authentication failures */
	uint32_t ns_tx_deauth;  /* deauthentications */
	uint32_t ns_tx_deauth_code;     /* last deauth reason */
	uint32_t ns_tx_disassoc;        /* disassociations */
	uint32_t ns_tx_disassoc_code;   /* last disassociation reason */
	uint32_t ns_psq_drops;  /* power save queue drops */
};

/*
 * station power save mode.
 */
typedef enum ieee80211_psmode {
	IEEE80211_PWRSAVE_NONE = 0,     /* no power save */
	IEEE80211_PWRSAVE_LOW,
	IEEE80211_PWRSAVE_NORMAL,
	IEEE80211_PWRSAVE_MAXIMUM,
	IEEE80211_PWRSAVE_WNM   /* WNM-Sleep Mode */
} ieee80211_pwrsave_mode;

/* station power save pspoll handling */
typedef enum {
	IEEE80211_CONTINUE_PSPOLL_FOR_MORE_DATA,
	IEEE80211_WAKEUP_FOR_MORE_DATA,
} ieee80211_pspoll_moredata_handling;

/*
 * apps power save state.
 */
typedef enum {
	APPS_AWAKE = 0,
	APPS_PENDING_SLEEP,
	APPS_SLEEP,
	APPS_FAKE_SLEEP,        /* Pending blocking sleep */
	APPS_FAKING_SLEEP,      /* Blocking sleep */
	APPS_UNKNOWN_PWRSAVE,
} ieee80211_apps_pwrsave_state;

typedef enum _iee80211_mimo_powersave_mode {
	IEEE80211_MIMO_POWERSAVE_NONE,  /* no mimo power save */
	IEEE80211_MIMO_POWERSAVE_STATIC,        /* static mimo power save */
	IEEE80211_MIMO_POWERSAVE_DYNAMIC        /* dynamic mimo powersave */
} ieee80211_mimo_powersave_mode;

#ifdef ATH_COALESCING
typedef enum _ieee80211_coalescing_state {
	IEEE80211_COALESCING_DISABLED = 0,      /* Coalescing is disabled */
	IEEE80211_COALESCING_DYNAMIC = 1,       /* Dynamically move to Enabled state based on Uruns */
	IEEE80211_COALESCING_ENABLED = 2,       /* Coalescing is enabled */
} ieee80211_coalescing_state;

#define IEEE80211_TX_COALESCING_THRESHOLD     5 /* Number of underrun errors to trigger coalescing */
#endif

typedef enum _ieee80211_cap {
	IEEE80211_CAP_SHSLOT,   /* CAPABILITY: short slot */
	IEEE80211_CAP_SHPREAMBLE,       /* CAPABILITY: short premable */
	IEEE80211_CAP_MULTI_DOMAIN,     /* CAPABILITY: multiple domain */
	IEEE80211_CAP_WMM,      /* CAPABILITY: WMM */
	IEEE80211_CAP_HT,       /* CAPABILITY: HT */
	IEEE80211_CAP_PERF_PWR_OFLD,    /* CAPABILITY: power performance offload support */
	IEEE80211_CAP_11AC,     /* CAPABILITY: 11ac support */
} ieee80211_cap;

typedef enum _ieee80211_device_param {
	IEEE80211_DEVICE_RSSI_CTL,
	IEEE80211_DEVICE_NUM_TX_CHAIN,
	IEEE80211_DEVICE_NUM_RX_CHAIN,
	IEEE80211_DEVICE_TX_CHAIN_MASK,
	IEEE80211_DEVICE_RX_CHAIN_MASK,
	IEEE80211_DEVICE_TX_CHAIN_MASK_LEGACY,
	IEEE80211_DEVICE_RX_CHAIN_MASK_LEGACY,
	IEEE80211_DEVICE_BMISS_LIMIT,   /* # of beacon misses for HW to generate BMISS intr */
	IEEE80211_DEVICE_PROTECTION_MODE,       /* protection mode */
	IEEE80211_DEVICE_BLKDFSCHAN,    /* block the use of DFS channels */
	IEEE80211_DEVICE_GREEN_AP_PS_ENABLE,
	IEEE80211_DEVICE_GREEN_AP_PS_TIMEOUT,
	IEEE80211_DEVICE_GREEN_AP_PS_ON_TIME,
	IEEE80211_DEVICE_CWM_EXTPROTMODE,
	IEEE80211_DEVICE_CWM_EXTPROTSPACING,
	IEEE80211_DEVICE_CWM_ENABLE,
	IEEE80211_DEVICE_CWM_EXTBUSYTHRESHOLD,
	IEEE80211_DEVICE_DOTH,
	IEEE80211_DEVICE_ADDBA_MODE,
	IEEE80211_DEVICE_COUNTRYCODE,
	IEEE80211_DEVICE_MULTI_CHANNEL, /* turn on/off off channel support */
	IEEE80211_DEVICE_MAX_AMSDU_SIZE,        /* Size of AMSDU to be sent on the air */
	IEEE80211_DEVICE_P2P,   /* Enable or Disable P2P */
	IEEE80211_DEVICE_OVERRIDE_SCAN_PROBERESPONSE_IE,        /* Override scan Probe response IE, 0: Don't over-ride */
	IEEE80211_DEVICE_2G_CSA,
	IEEE80211_DEVICE_PWRTARGET,
	IEEE80211_DEVICE_OFF_CHANNEL_SUPPORT,
} ieee80211_device_param;

typedef enum _ieee80211_param {
	IEEE80211_BEACON_INTVAL,        /* in TUs */
	IEEE80211_LISTEN_INTVAL,        /* number of beacons */
	IEEE80211_DTIM_INTVAL,  /* number of beacons */
	IEEE80211_BMISS_COUNT_RESET,    /* number of beacon miss intrs before reset */
	IEEE80211_BMISS_COUNT_MAX,      /* number of beacon miss intrs for bmiss notificationst */
	IEEE80211_ATIM_WINDOW,  /* ATIM window */
	IEEE80211_SHORT_SLOT,   /* short slot on/off */
	IEEE80211_SHORT_PREAMBLE,       /* short preamble on/off */
	IEEE80211_RTS_THRESHOLD,        /* rts threshold, 0 means no rts threshold  */
	IEEE80211_FRAG_THRESHOLD,       /* fragmentation threshold, 0 means no rts threshold  */
	IEEE80211_FIXED_RATE,   /*
	                         * rate code series(0: auto rate, 32 bit value:  rate
	                         * codes for 4 rate series. each byte for one rate series)
	                         */
	IEEE80211_MCAST_RATE,   /* rate in Kbps */
	IEEE80211_TXPOWER,      /* in 0.5db units */
	IEEE80211_AMPDU_DENCITY,        /* AMPDU dencity */
	IEEE80211_AMPDU_LIMIT,  /* AMPDU limit */
	IEEE80211_MAX_AMPDU,    /* Max AMPDU Exp */
	IEEE80211_VHT_MAX_AMPDU,        /* VHT Max AMPDU Exp */
	IEEE80211_WPS_MODE,     /* WPS mode */
	IEEE80211_TSN_MODE,     /* TSN mode */
	IEEE80211_MULTI_DOMAIN, /* Multiple domain */
	IEEE80211_SAFE_MODE,    /* Safe mode */
	IEEE80211_NOBRIDGE_MODE,        /* No bridging done, all frames sent up the stack */
	IEEE80211_PERSTA_KEYTABLE_SIZE, /* IBSS-only, read-only: persta key table size */
	IEEE80211_RECEIVE_80211,        /* deliver std 802.11 frames 802.11 instead of ethernet frames on the rx */
	IEEE80211_SEND_80211,   /* OS sends std 802.11 frames 802.11 instead of ethernet frames on tx side */
	IEEE80211_MIN_BEACON_COUNT,     /* minimum number beacons to tx/rx before vap can pause */
	IEEE80211_IDLE_TIME,    /* minimun no activity time before vap can pause */
	IEEE80211_MIN_FRAMESIZE,        /* smallest frame size we are allowed to receive */
	/* features. 0:feature is off. 1:feature is on. */
	IEEE80211_FEATURE_WMM,  /* WMM */
	IEEE80211_FEATURE_WMM_PWRSAVE,  /* WMM Power Save */
	IEEE80211_FEATURE_UAPSD,        /* UAPSD setting (BE/BK/VI/VO) */
	IEEE80211_FEATURE_WDS,  /* dynamic WDS feature */
	IEEE80211_FEATURE_PRIVACY,      /* encryption */
	IEEE80211_FEATURE_DROP_UNENC,   /* drop un encrypted frames */
	IEEE80211_FEATURE_COUNTER_MEASURES,     /* turn on counter measures */
	IEEE80211_FEATURE_HIDE_SSID,    /* turn on hide ssid feature */
	IEEE80211_FEATURE_APBRIDGE,     /* turn on internal mcast traffic bridging for AP */
	IEEE80211_FEATURE_PUREB,        /* turn on pure B mode for AP */
	IEEE80211_FEATURE_PUREG,        /* turn on pure G mode for AP */
	IEEE80211_FEATURE_REGCLASS,     /* add regulatory class IE in AP */
	IEEE80211_FEATURE_COUNTRY_IE,   /* add country IE for vap in AP */
	IEEE80211_FEATURE_IC_COUNTRY_IE,        /* add country IE for ic in AP */
	IEEE80211_FEATURE_DOTH, /* enable 802.11h */
	IEEE80211_FEATURE_PURE11N,      /* enable pure 11n  mode */
	IEEE80211_FEATURE_PRIVATE_RSNIE,        /* enable OS shim to setup RSN IE */
	IEEE80211_FEATURE_COPY_BEACON,  /* keep a copy of beacon */
	IEEE80211_FEATURE_PSPOLL,       /* enable/disable pspoll mode in power save SM */
	IEEE80211_FEATURE_CONTINUE_PSPOLL_FOR_MOREDATA, /* enable/disable option to contunue sending ps polls when there is more data */
	IEEE80211_FEATURE_AMPDU,        /* Enable or Disable Aggregation */
#ifdef ATH_COALESCING
	IEEE80211_FEATURE_TX_COALESCING,        /* enable tx coalescing */
#endif
	IEEE80211_FEATURE_VAP_IND,      /* Repeater independent VAP */
	IEEE80211_FIXED_RETRIES,        /* fixed retries  0-4 */
	IEEE80211_SHORT_GI,     /* short gi on/off */
	IEEE80211_HT40_INTOLERANT,
	IEEE80211_CHWIDTH,
	IEEE80211_CHEXTOFFSET,
	IEEE80211_DISABLE_2040COEXIST,
	IEEE80211_DISABLE_HTPROTECTION,
	IEEE80211_STA_QUICKKICKOUT,
	IEEE80211_CHSCANINIT,
	IEEE80211_FEATURE_STAFWD,       /* dynamic AP Client  feature */
	IEEE80211_DRIVER_CAPS,
	IEEE80211_UAPSD_MAXSP,  /* UAPSD service period setting (0:unlimited, 2,4,6) */
	IEEE80211_WEP_MBSSID,
	IEEE80211_MGMT_RATE,    /* ieee rate to be used for management */
	IEEE80211_RESMGR_VAP_AIR_TIME_LIMIT,    /* When multi-channel enabled, restrict air-time allocated to a VAP */
	IEEE80211_TDLS_MACADDR1,        /* Upper 4 bytes of device's MAC address */
	IEEE80211_TDLS_MACADDR2,        /* Lower 2 bytes of device's MAC address */
	IEEE80211_TDLS_ACTION,  /* TDLS action requested                 */
	IEEE80211_AUTO_ASSOC,
	IEEE80211_PROTECTION_MODE,      /* per VAP protection mode */
	IEEE80211_AUTH_INACT_TIMEOUT,   /* inactivity time while waiting for 802.11x auth to complete */
	IEEE80211_INIT_INACT_TIMEOUT,   /* inactivity time while waiting for 802.11 auth/assoc to complete */
	IEEE80211_RUN_INACT_TIMEOUT,    /* inactivity time when fully authed */
	IEEE80211_PROBE_INACT_TIMEOUT,  /* inactivity counter value below which starts probing */
	IEEE80211_QBSS_LOAD,
	IEEE80211_WNM_CAP,
	IEEE80211_WNM_BSS_CAP,
	IEEE80211_WNM_TFS_CAP,
	IEEE80211_WNM_TIM_CAP,
	IEEE80211_WNM_SLEEP_CAP,
	IEEE80211_WNM_FMS_CAP,
	IEEE80211_AP_REJECT_DFS_CHAN,   /* AP to reject resuming on DFS Channel */
	IEEE80211_ABOLT,
	IEEE80211_COMP,
	IEEE80211_FF,
	IEEE80211_TURBO,
	IEEE80211_BURST,
	IEEE80211_AR,
	IEEE80211_SLEEP,
	IEEE80211_EOSPDROP,
	IEEE80211_MARKDFS,
	IEEE80211_WDS_AUTODETECT,
	IEEE80211_WEP_TKIP_HT,
	IEEE80211_ATH_RADIO,
	IEEE80211_IGNORE_11DBEACON,
	/* Video debug feature */
	IEEE80211_VI_DBG_CFG,   /* Video debug configuration - Bit0- enable dbg, Bit1 - enable stats log */
	IEEE80211_VI_DBG_NUM_STREAMS,   /* Total number of receive streams */
	IEEE80211_VI_STREAM_NUM,        /* the stream number whose marker parameters are being set */
	IEEE80211_VI_DBG_NUM_MARKERS,   /* total number of markers used to filter pkts */
	IEEE80211_VI_MARKER_NUM,        /* the marker number whose parameters (offset, size & match) are being set */
	IEEE80211_VI_MARKER_OFFSET_SIZE,        /* byte offset from skb start (upper 16 bits) & size in bytes(lower 16 bits) */
	IEEE80211_VI_MARKER_MATCH,      /* marker pattern match used in filtering */
	IEEE80211_VI_RXSEQ_OFFSET_SIZE, /* Rx Seq num offset skb start (upper 16 bits) & size in bytes(lower 16 bits) */
	IEEE80211_VI_RX_SEQ_RSHIFT,     /* right-shift value in case field is not word aligned */
	IEEE80211_VI_RX_SEQ_MAX,        /* maximum Rx Seq number (to check wrap around) */
	IEEE80211_VI_RX_SEQ_DROP,       /* Indicator to the debug app that a particular seq num has been dropped */
	IEEE80211_VI_TIME_OFFSET_SIZE,  /* Timestamp offset skb start (upper 16 bits) & size in bytes(lower 16 bits) */
	IEEE80211_VI_RESTART,   /* If set to 1 resets all internal variables/counters & restarts debug tool */
	IEEE80211_VI_RXDROP_STATUS,     /* Total RX drops in wireless */
	IEEE80211_TRIGGER_MLME_RESP,    /* Option for App to trigger mlme response */
#ifdef ATH_SUPPORT_TxBF
	IEEE80211_TXBF_AUTO_CVUPDATE,   /* auto CV update enable */
	IEEE80211_TXBF_CVUPDATE_PER,    /* per threshold to initial CV update */
#endif
	IEEE80211_MAX_CLIENT_NUMBERS,
	IEEE80211_SMARTNET,
	IEEE80211_FEATURE_MFP_TEST,     /* MFP test */
	IEEE80211_WEATHER_RADAR,        /* weather radar channel skip */
	IEEE80211_WEP_KEYCACHE, /* WEP KEYCACHE is enable */
	IEEE80211_SEND_DEAUTH,  /* send deauth instead of disassoc while doing interface down  */
	IEEE80211_SET_TXPWRADJUST,
	IEEE80211_RRM_CAP,
	IEEE80211_RRM_DEBUG,
	IEEE80211_RRM_STATS,
	IEEE80211_RRM_SLWINDOW,
	IEEE80211_FEATURE_OFF_CHANNEL_SUPPORT,
	IEEE80211_FIXED_VHT_MCS,        /* VHT mcs index */
	IEEE80211_FIXED_NSS,    /* Spatial Streams count */
	IEEE80211_SUPPORT_LDPC, /* LDPC Support */
	IEEE80211_SUPPORT_TX_STBC,      /* TX STBC enable/disable */
	IEEE80211_SUPPORT_RX_STBC,      /* RX STBC enable/disable */
	IEEE80211_DEFAULT_KEYID,        /* XMIT default key */
	IEEE80211_OPMODE_NOTIFY_ENABLE, /* Op mode notification enable/disable */
	IEEE80211_ENABLE_RTSCTS,        /* Enable/Disable RTS-CTS */
	IEEE80211_VHT_MCSMAP,   /* VHT MCS Map */
	IEEE80211_GET_ACS_STATE,        /* get acs state */
	IEEE80211_GET_CAC_STATE,        /* get cac state */
} ieee80211_param;

#define  IEEE80211_PROTECTION_NONE         0
#define  IEEE80211_PROTECTION_CTSTOSELF    1
#define  IEEE80211_PROTECTION_RTS_CTS      2

typedef enum _ieee80211_privacy_filter {
	IEEE80211_PRIVACY_FILTER_ALLWAYS,
	IEEE80211_PRIVACY_FILTER_KEY_UNAVAILABLE,
} ieee80211_privacy_filter;

typedef enum _ieee80211_privacy_filter_packet_type {
	IEEE80211_PRIVACY_FILTER_PACKET_UNICAST,
	IEEE80211_PRIVACY_FILTER_PACKET_MULTICAST,
	IEEE80211_PRIVACY_FILTER_PACKET_BOTH
} ieee80211_privacy_filter_packet_type;

typedef struct _ieee80211_privacy_excemption_filter {
	uint16_t ether_type;    /* type of ethernet to apply this filter, in host byte order */
	ieee80211_privacy_filter filter_type;
	ieee80211_privacy_filter_packet_type packet_type;
} ieee80211_privacy_exemption;

/*
 * Authentication mode.
 * NB: the usage of auth modes NONE, AUTO are deprecated,
 * they are implemented through combinations of other auth modes
 * and cipher types. The deprecated values are preserved here to
 * maintain binary compatibility with applications like
 * wpa_supplicant and hostapd.
 */
typedef enum _ieee80211_auth_mode {
	IEEE80211_AUTH_NONE = 0,        /* deprecated */
	IEEE80211_AUTH_OPEN = 1,        /* open */
	IEEE80211_AUTH_SHARED = 2,      /* shared-key */
	IEEE80211_AUTH_8021X = 3,       /* 802.1x */
	IEEE80211_AUTH_AUTO = 4,        /* deprecated */
	IEEE80211_AUTH_WPA = 5, /* WPA */
	IEEE80211_AUTH_RSNA = 6,        /* WPA2/RSNA */
	IEEE80211_AUTH_CCKM = 7,        /* CCK */
	IEEE80211_AUTH_WAPI = 8,        /* WAPI */
} ieee80211_auth_mode;

#define IEEE80211_AUTH_MAX      (IEEE80211_AUTH_WAPI+1)

/*
 * Cipher types.
 * NB: The values are preserved here to maintain binary compatibility
 * with applications like wpa_supplicant and hostapd.
 */
typedef enum _ieee80211_cipher_type {
	IEEE80211_CIPHER_WEP = 0,
	IEEE80211_CIPHER_TKIP = 1,
	IEEE80211_CIPHER_AES_OCB = 2,
	IEEE80211_CIPHER_AES_CCM = 3,
	IEEE80211_CIPHER_WAPI = 4,
	IEEE80211_CIPHER_CKIP = 5,
	IEEE80211_CIPHER_AES_CMAC = 6,
	IEEE80211_CIPHER_NONE = 7,
} ieee80211_cipher_type;

#define IEEE80211_CIPHER_MAX    (IEEE80211_CIPHER_NONE+1)

/* key direction */
typedef enum _ieee80211_key_direction {
	IEEE80211_KEY_DIR_TX,
	IEEE80211_KEY_DIR_RX,
	IEEE80211_KEY_DIR_BOTH
} ieee80211_key_direction;

#define IEEE80211_KEYIX_NONE    ((uint16_t) -1)

typedef struct _ieee80211_keyval {
	ieee80211_cipher_type keytype;
	ieee80211_key_direction keydir;
	u_int persistent : 1,     /* persistent key */
	      mfp : 1;          /* management frame protection */
	uint16_t keylen;        /* length of the key data fields */
	uint8_t *macaddr;       /* mac address of length IEEE80211_ADDR_LEN . all bytes are 0xff for multicast key */
	uint64_t keyrsc;
	uint64_t keytsc;
	uint16_t txmic_offset;  /* TKIP/SMS4 only: offset to tx mic key */
	uint16_t rxmic_offset;  /* TKIP/SMS4 only: offset to rx mic key */
	uint8_t *keydata;
#ifdef ATH_SUPPORT_WAPI
	uint8_t key_used;       /*index for WAPI rekey labeling */
#endif
} ieee80211_keyval;

#define IEEE80211_AES_CMAC_LEN     128
typedef enum _ieee80211_rsn_param {
	IEEE80211_UCAST_CIPHER_LEN,
	IEEE80211_MCAST_CIPHER_LEN,
	IEEE80211_MCASTMGMT_CIPHER_LEN,
	IEEE80211_KEYMGT_ALGS,
	IEEE80211_RSN_CAPS
} ieee80211_rsn_param;

#define IEEE80211_PMKID_LEN     16

typedef struct _ieee80211_pmkid_entry {
	uint8_t bssid[IEEE80211_ADDR_LEN];
	uint8_t pmkid[IEEE80211_PMKID_LEN];
} ieee80211_pmkid_entry;

typedef enum _wlan_wme_param {
	WLAN_WME_CWMIN,
	WLAN_WME_CWMAX,
	WLAN_WME_AIFS,
	WLAN_WME_TXOPLIMIT,
	WLAN_WME_ACM,           /*bss only */
	WLAN_WME_ACKPOLICY      /*bss only */
} wlan_wme_param;

typedef enum _ieee80211_frame_type {
	IEEE80211_FRAME_TYPE_PROBEREQ,
	IEEE80211_FRAME_TYPE_BEACON,
	IEEE80211_FRAME_TYPE_PROBERESP,
	IEEE80211_FRAME_TYPE_ASSOCREQ,
	IEEE80211_FRAME_TYPE_ASSOCRESP,
	IEEE80211_FRAME_TYPE_AUTH
} ieee80211_frame_type;

#define IEEE80211_FRAME_TYPE_MAX    (IEEE80211_FRAME_TYPE_AUTH+1)

typedef enum _ieee80211_ampdu_mode {
	IEEE80211_AMPDU_MODE_OFF,       /* disable AMPDU */
	IEEE80211_AMPDU_MODE_ON,        /* enable AMPDU */
	IEEE80211_AMPDU_MODE_WDSVAR     /* enable AMPDU with 4addr WAR */
} ieee80211_ampdu_mode;

typedef enum _ieee80211_reset_type {
	IEEE80211_RESET_TYPE_DEVICE = 0,        /* device reset on error: tx timeout and etc. */
	IEEE80211_RESET_TYPE_DOT11_INTF,        /* dot11 reset: only reset one network interface (vap) */
	IEEE80211_RESET_TYPE_INTERNAL,  /* internal reset */
} ieee80211_reset_type;

typedef struct _ieee80211_reset_request {
	ieee80211_reset_type type;

	u_int reset_hw : 1,       /* reset the actual H/W */
	/*
	 * The following fields are only valid for DOT11 reset, i.e.,
	 * IEEE80211_RESET_TYPE_DOT11_INTF
	 */
	      reset_phy : 1,    /* reset PHY */
	      reset_mac : 1,    /* reset MAC */
	      set_default_mib : 1, /* set default MIB variables */
	      no_flush : 1;
	uint8_t macaddr[IEEE80211_ADDR_LEN];
	enum ieee80211_phymode phy_mode;
} ieee80211_reset_request;

#define IEEE80211_MSG_MAX 63
#define IEEE80211_MSG_SMARTANT 7        /* Bit 7 (0x80)for Smart Antenna debug */
enum {
	/* IEEE80211_PARAM_DBG_LVL */
	IEEE80211_MSG_TDLS = 0, /* TDLS */
	IEEE80211_MSG_ACS,      /* auto channel selection */
	IEEE80211_MSG_SCAN_SM,  /* scan state machine */
	IEEE80211_MSG_SCANENTRY,        /* scan entry */
	IEEE80211_MSG_WDS,      /* WDS handling */
	IEEE80211_MSG_ACTION,   /* action management frames */
	IEEE80211_MSG_ROAM,     /* sta-mode roaming */
	IEEE80211_MSG_INACT,    /* inactivity handling */
	IEEE80211_MSG_DOTH = 8, /* 11.h */
	IEEE80211_MSG_IQUE,     /* IQUE features */
	IEEE80211_MSG_WME,      /* WME protocol */
	IEEE80211_MSG_ACL,      /* ACL handling */
	IEEE80211_MSG_WPA,      /* WPA/RSN protocol */
	IEEE80211_MSG_RADKEYS,  /* dump 802.1x keys */
	IEEE80211_MSG_RADDUMP,  /* dump 802.1x radius packets */
	IEEE80211_MSG_RADIUS,   /* 802.1x radius client */
	IEEE80211_MSG_DOT1XSM = 16,     /* 802.1x state machine */
	IEEE80211_MSG_DOT1X,    /* 802.1x authenticator */
	IEEE80211_MSG_POWER,    /* power save handling */
	IEEE80211_MSG_STATE,    /* state machine */
	IEEE80211_MSG_OUTPUT,   /* output handling */
	IEEE80211_MSG_SCAN,     /* scanning */
	IEEE80211_MSG_AUTH,     /* authentication handling */
	IEEE80211_MSG_ASSOC,    /* association handling */
	IEEE80211_MSG_NODE = 24,        /* node handling */
	IEEE80211_MSG_ELEMID,   /* element id parsing */
	IEEE80211_MSG_XRATE,    /* rate set handling */
	IEEE80211_MSG_INPUT,    /* input handling */
	IEEE80211_MSG_CRYPTO,   /* crypto work */
	IEEE80211_MSG_DUMPPKTS, /* IFF_LINK2 equivalant */
	IEEE80211_MSG_DEBUG,    /* IFF_DEBUG equivalent */
	IEEE80211_MSG_MLME,     /* MLME */
	/* IEEE80211_PARAM_DBG_LVL_HIGH */
	IEEE80211_MSG_RRM = 32, /* Radio resource measurement */
	IEEE80211_MSG_WNM,      /* Wireless Network Management */
	IEEE80211_MSG_P2P_PROT, /* P2P Protocol driver */
	IEEE80211_MSG_PROXYARP, /* 11v Proxy ARP */
	IEEE80211_MSG_L2TIF,    /* Hotspot 2.0 L2 TIF */
	IEEE80211_MSG_WIFIPOS,  /* WifiPositioning Feature */
	IEEE80211_MSG_WRAP,     /* WRAP or Wireless ProxySTA */
	IEEE80211_MSG_DFS,      /* DFS debug mesg */

	IEEE80211_MSG_NUM_CATEGORIES,   /* total ieee80211 messages */
	IEEE80211_MSG_UNMASKABLE = IEEE80211_MSG_MAX,   /* anything */
	IEEE80211_MSG_ANY = IEEE80211_MSG_MAX,  /* anything */
};

/* verbosity levels */
#define     IEEE80211_VERBOSE_OFF                  100
#define     IEEE80211_VERBOSE_FORCE               1
#define     IEEE80211_VERBOSE_SERIOUS             2
#define     IEEE80211_VERBOSE_NORMAL              3
#define     IEEE80211_VERBOSE_LOUD                4
#define     IEEE80211_VERBOSE_DETAILED            5
#define     IEEE80211_VERBOSE_COMPLEX             6
#define     IEEE80211_VERBOSE_FUNCTION            7
#define     IEEE80211_VERBOSE_TRACE               8

#define IEEE80211_DEBUG_DEFAULT IEEE80211_MSG_DEBUG

/*
 * the lower 4 bits of the msg flags are used for extending the
 * debug flags.
 */

/*
 * flag definitions for wlan_mlme_stop_bss(vap) API.
 */
#define WLAN_MLME_STOP_BSS_F_SEND_DEAUTH                0x01
#define WLAN_MLME_STOP_BSS_F_CLEAR_ASSOC_STATE          0x02
#define WLAN_MLME_STOP_BSS_F_FORCE_STOP_RESET           0x04
#define WLAN_MLME_STOP_BSS_F_WAIT_RX_DONE               0x08
#define WLAN_MLME_STOP_BSS_F_NO_RESET                   0x10
#define WLAN_MLME_STOP_BSS_F_STANDBY                    0x20

/*
 * WAPI commands to authenticator
 */
#define WAPI_WAI_REQUEST            (uint16_t)0x00F1
#define WAPI_UNICAST_REKEY          (uint16_t)0x00F2
#define WAPI_STA_AGING              (uint16_t)0x00F3
#define WAPI_MULTI_REKEY            (uint16_t)0x00F4
#define WAPI_STA_STATS              (uint16_t)0x00F5

/*
 * IEEE80211 PHY Statistics.
 */
struct ieee80211_phy_stats {
	uint64_t ips_tx_packets;        /* frames successfully transmitted */
	uint64_t ips_tx_multicast;      /* multicast/broadcast frames successfully transmitted */
	uint64_t ips_tx_fragments;      /* fragments successfully transmitted */
	uint64_t ips_tx_xretries;       /* frames that are xretried. NB: not number of retries */
	uint64_t ips_tx_retries;        /* frames transmitted after retries. NB: not number of retries */
	uint64_t ips_tx_multiretries;   /* frames transmitted after more than one retry. */
	uint64_t ips_tx_timeout;        /* frames that expire the dot11MaxTransmitMSDULifetime */
	uint64_t ips_rx_packets;        /* frames successfully received */
	uint64_t ips_rx_multicast;      /* multicast/broadcast frames successfully received */
	uint64_t ips_rx_fragments;      /* fragments successfully received */
	uint64_t ips_rx_timeout;        /* frmaes that expired the dot11MaxReceiveLifetime */
	uint64_t ips_rx_dup;    /* duplicated fragments */
	uint64_t ips_rx_mdup;   /* multiple duplicated fragments */
	uint64_t ips_rx_promiscuous;    /* frames that are received only because promiscuous filter is on */
	uint64_t ips_rx_promiscuous_fragments;  /* fragments that are received only because promiscuous filter is on */
	uint64_t ips_tx_rts;    /* RTS success count */
	uint64_t ips_tx_shortretry;     /* tx on-chip retries (short). RTSFailCnt */
	uint64_t ips_tx_longretry;      /* tx on-chip retries (long). DataFailCnt */
	uint64_t ips_rx_crcerr; /* rx failed 'cuz of bad CRC */
	uint64_t ips_rx_fifoerr;        /* rx failed 'cuz of FIFO overrun */
	uint64_t ips_rx_decrypterr;     /* rx decryption error */
};

struct ieee80211_chan_stats {
	uint32_t chan_clr_cnt;
	uint32_t cycle_cnt;
	uint32_t phy_err_cnt;
};

struct ieee80211_mac_stats {
	uint64_t ims_tx_packets;        /* frames successfully transmitted */
	uint64_t ims_rx_packets;        /* frames successfully received */
	uint64_t ims_tx_bytes;  /* bytes successfully transmitted */
	uint64_t ims_rx_bytes;  /* bytes successfully received */

	/* TODO: For the byte counts below, we need to handle some scenarios
	   such as encryption related decaps, etc */
	uint64_t ims_tx_data_packets;   /* data frames successfully transmitted */
	uint64_t ims_rx_data_packets;   /* data frames successfully received */
	uint64_t ims_tx_data_bytes;     /* data bytes successfully transmitted,
	                                   inclusive of FCS. */
	uint64_t ims_rx_data_bytes;     /* data bytes successfully received,
	                                   inclusive of FCS. */

	uint64_t ims_tx_datapyld_bytes; /* data payload bytes successfully
	                                   transmitted */
	uint64_t ims_rx_datapyld_bytes; /* data payload successfully
	                                   received */

	/* Decryption errors */
	uint64_t ims_rx_unencrypted;    /* rx w/o wep and privacy on */
	uint64_t ims_rx_badkeyid;       /* rx w/ incorrect keyid */
	uint64_t ims_rx_decryptok;      /* rx decrypt okay */
	uint64_t ims_rx_decryptcrc;     /* rx decrypt failed on crc */
	uint64_t ims_rx_wepfail;        /* rx wep processing failed */
	uint64_t ims_rx_tkipreplay;     /* rx seq# violation (TKIP) */
	uint64_t ims_rx_tkipformat;     /* rx format bad (TKIP) */
	uint64_t ims_rx_tkipmic;        /* rx MIC check failed (TKIP) */
	uint64_t ims_rx_tkipicv;        /* rx ICV check failed (TKIP) */
	uint64_t ims_rx_ccmpreplay;     /* rx seq# violation (CCMP) */
	uint64_t ims_rx_ccmpformat;     /* rx format bad (CCMP) */
	uint64_t ims_rx_ccmpmic;        /* rx MIC check failed (CCMP) */
/*this file can be included by applications as 80211stats that has no such MACRO definition*/
/* #if ATH_SUPPORT_WAPI */
	uint64_t ims_rx_wpireplay;      /* rx seq# violation (WPI) */
	uint64_t ims_rx_wpimic; /* rx MIC check failed (WPI) */
/* #endif */
	/* Other Tx/Rx errors */
	uint64_t ims_tx_discard;        /* tx dropped by NIC */
	uint64_t ims_rx_discard;        /* rx dropped by NIC */

	uint64_t ims_rx_countermeasure; /* rx TKIP countermeasure activation count */
};

/*
 * Summary statistics.
 */
struct ieee80211_stats {
	uint32_t is_rx_badversion;      /* rx frame with bad version */
	uint32_t is_rx_tooshort;        /* rx frame too short */
	uint32_t is_rx_wrongbss;        /* rx from wrong bssid */
	uint32_t is_rx_wrongdir;        /* rx w/ wrong direction */
	uint32_t is_rx_mcastecho;       /* rx discard 'cuz mcast echo */
	uint32_t is_rx_notassoc;        /* rx discard 'cuz sta !assoc */
	uint32_t is_rx_noprivacy;       /* rx w/ wep but privacy off */
	uint32_t is_rx_decap;   /* rx decapsulation failed */
	uint32_t is_rx_mgtdiscard;      /* rx discard mgt frames */
	uint32_t is_rx_ctl;     /* rx discard ctrl frames */
	uint32_t is_rx_beacon;  /* rx beacon frames */
	uint32_t is_rx_rstoobig;        /* rx rate set truncated */
	uint32_t is_rx_elem_missing;    /* rx required element missing */
	uint32_t is_rx_elem_toobig;     /* rx element too big */
	uint32_t is_rx_elem_toosmall;   /* rx element too small */
	uint32_t is_rx_elem_unknown;    /* rx element unknown */
	uint32_t is_rx_badchan; /* rx frame w/ invalid chan */
	uint32_t is_rx_chanmismatch;    /* rx frame chan mismatch */
	uint32_t is_rx_nodealloc;       /* rx frame dropped */
	uint32_t is_rx_ssidmismatch;    /* rx frame ssid mismatch  */
	uint32_t is_rx_auth_unsupported;        /* rx w/ unsupported auth alg */
	uint32_t is_rx_auth_fail;       /* rx sta auth failure */
	uint32_t is_rx_auth_countermeasures;    /* rx auth discard 'cuz CM */
	uint32_t is_rx_assoc_bss;       /* rx assoc from wrong bssid */
	uint32_t is_rx_assoc_notauth;   /* rx assoc w/o auth */
	uint32_t is_rx_assoc_capmismatch;       /* rx assoc w/ cap mismatch */
	uint32_t is_rx_assoc_norate;    /* rx assoc w/ no rate match */
	uint32_t is_rx_assoc_badwpaie;  /* rx assoc w/ bad WPA IE */
	uint32_t is_rx_deauth;  /* rx deauthentication */
	uint32_t is_rx_disassoc;        /* rx disassociation */
	uint32_t is_rx_action;  /* rx action mgt */
	uint32_t is_rx_badsubtype;      /* rx frame w/ unknown subtype */
	uint32_t is_rx_nobuf;   /* rx failed for lack of buf */
	uint32_t is_rx_ahdemo_mgt;      /* rx discard ahdemo mgt frame */
	uint32_t is_rx_bad_auth;        /* rx bad auth request */
	uint32_t is_rx_unauth;  /* rx on unauthorized port */
	uint32_t is_rx_badcipher;       /* rx failed 'cuz key type */
	uint32_t is_tx_nodefkey;        /* tx failed 'cuz no defkey */
	uint32_t is_tx_noheadroom;      /* tx failed 'cuz no space */
	uint32_t is_rx_nocipherctx;     /* rx failed 'cuz key !setup */
	uint32_t is_rx_acl;     /* rx discard 'cuz acl policy */
	uint32_t is_rx_ffcnt;   /* rx fast frames */
	uint32_t is_rx_badathtnl;       /* driver key alloc failed */
	uint32_t is_rx_nowds;   /* 4-addr packets received with no wds enabled */
	uint32_t is_tx_nobuf;   /* tx failed for lack of buf */
	uint32_t is_tx_nonode;  /* tx failed for no node */
	uint32_t is_tx_unknownmgt;      /* tx of unknown mgt frame */
	uint32_t is_tx_badcipher;       /* tx failed 'cuz key type */
	uint32_t is_tx_ffokcnt; /* tx fast frames sent success */
	uint32_t is_tx_fferrcnt;        /* tx fast frames sent success */
	uint32_t is_scan_active;        /* active scans started */
	uint32_t is_scan_passive;       /* passive scans started */
	uint32_t is_node_timeout;       /* nodes timed out inactivity */
	uint32_t is_crypto_nomem;       /* no memory for crypto ctx */
	uint32_t is_crypto_tkip;        /* tkip crypto done in s/w */
	uint32_t is_crypto_tkipenmic;   /* tkip en-MIC done in s/w */
	uint32_t is_crypto_tkipdemic;   /* tkip de-MIC done in s/w */
	uint32_t is_crypto_tkipcm;      /* tkip counter measures */
	uint32_t is_crypto_ccmp;        /* ccmp crypto done in s/w */
	uint32_t is_crypto_wep; /* wep crypto done in s/w */
	uint32_t is_crypto_setkey_cipher;       /* cipher rejected key */
	uint32_t is_crypto_setkey_nokey;        /* no key index for setkey */
	uint32_t is_crypto_delkey;      /* driver key delete failed */
	uint32_t is_crypto_badcipher;   /* unknown cipher */
	uint32_t is_crypto_nocipher;    /* cipher not available */
	uint32_t is_crypto_attachfail;  /* cipher attach failed */
	uint32_t is_crypto_swfallback;  /* cipher fallback to s/w */
	uint32_t is_crypto_keyfail;     /* driver key alloc failed */
	uint32_t is_crypto_enmicfail;   /* en-MIC failed */
	uint32_t is_ibss_capmismatch;   /* merge failed-cap mismatch */
	uint32_t is_ibss_norate;        /* merge failed-rate mismatch */
	uint32_t is_ps_unassoc; /* ps-poll for unassoc. sta */
	uint32_t is_ps_badaid;  /* ps-poll w/ incorrect aid */
	uint32_t is_ps_qempty;  /* ps-poll w/ nothing to send */
};

typedef enum _ieee80211_send_frame_type {
	IEEE80211_SEND_NULL,
	IEEE80211_SEND_QOSNULL,
} ieee80211_send_frame_type;

typedef struct _ieee80211_tspec_info {
	uint8_t traffic_type;
	uint8_t direction;
	uint8_t dot1Dtag;
	uint8_t tid;
	uint8_t acc_policy_edca;
	uint8_t acc_policy_hcca;
	uint8_t aggregation;
	uint8_t psb;
	uint8_t ack_policy;
	uint16_t norminal_msdu_size;
	uint16_t max_msdu_size;
	uint32_t min_srv_interval;
	uint32_t max_srv_interval;
	uint32_t inactivity_interval;
	uint32_t suspension_interval;
	uint32_t srv_start_time;
	uint32_t min_data_rate;
	uint32_t mean_data_rate;
	uint32_t peak_data_rate;
	uint32_t max_burst_size;
	uint32_t delay_bound;
	uint32_t min_phy_rate;
	uint16_t surplus_bw;
	uint16_t medium_time;
} ieee80211_tspec_info;

#ifndef EXTERNAL_USE_ONLY
/*
 * Manual ADDBA support
 */
enum {
	ADDBA_SEND = 0,
	ADDBA_STATUS = 1,
	DELBA_SEND = 2,
	ADDBA_RESP = 3,
	ADDBA_CLR_RESP = 4,
	SINGLE_AMSDU = 5,
};

enum {
	ADDBA_MODE_AUTO = 0,
	ADDBA_MODE_MANUAL = 1,
};

struct ieee80211_addba_delba_request {
	wlan_dev_t ic;
	uint8_t action;
	uint8_t tid;
	uint16_t status;
	uint16_t aid;
	uint32_t arg1;
	uint32_t arg2;
};
#endif /* EXTERNAL_USE_ONLY */

#ifdef ATH_BT_COEX
typedef enum _ieee80211_bt_coex_info_type {
	IEEE80211_BT_COEX_INFO_SCHEME = 0,
	IEEE80211_BT_COEX_INFO_BTBUSY = 1,
} ieee80211_bt_coex_info_type;
#endif

struct tkip_countermeasure {
	uint16_t mic_count_in_60s;
	uint32_t timestamp;
};

enum _ieee80211_qos_frame_direction {
	IEEE80211_RX_QOS_FRAME = 0,
	IEEE80211_TX_QOS_FRAME = 1,
	IEEE80211_TX_COMPLETE_QOS_FRAME = 2
};

typedef struct ieee80211_vap_opmode_count {
	int total_vaps;
	int ibss_count;
	int sta_count;
	int wds_count;
	int ahdemo_count;
	int ap_count;
	int monitor_count;
	int btamp_count;
	int unknown_count;
} ieee80211_vap_opmode_count;

struct ieee80211_app_ie_t {
	uint32_t length;
	uint8_t *ie;
};

/*
 * MAC ACL operations.
 */
enum {
	IEEE80211_MACCMD_POLICY_OPEN = 0,       /* set policy: no ACL's */
	IEEE80211_MACCMD_POLICY_ALLOW = 1,      /* set policy: allow traffic */
	IEEE80211_MACCMD_POLICY_DENY = 2,       /* set policy: deny traffic */
	IEEE80211_MACCMD_FLUSH = 3,     /* flush ACL database */
	IEEE80211_MACCMD_DETACH = 4,    /* detach ACL policy */
	IEEE80211_MACCMD_POLICY_RADIUS = 5,     /* set policy: RADIUS managed ACLs */
};

#endif
